<?php
/**
* Classe de representação de uma camada de negócio da entidade Lote
* A camada de negócio é a parte que engloba as regras e efetua os comandos de execução de um sistema
* @package Sistema
* @subpackage Lote
*/
class NLote extends negocioPadrao{
	const fechado = 'F';
	const aberto = 'A';
	/**
	* @gerador variavelPadrao
	* @var integer Identificador
	*/
	public $idLote;
	/**
	* @gerador variavelPadrao
	* @var TData Data
	*/
	public $data;
	/**
	* @gerador variavelPadrao
	* @var string Status
	*/
	public $status;
	/**
	* Retorna o nome da propriedade que contém o valor chave de negócio
	* @gerador metodoPadrao
	* @return string
	*/
	function nomeChave(){ return 'idLote'; }
	/**
	 * Valida um lote para fechamento
	 * @return boolean
	 */
	protected final function validarFechamento(){
		$nLancamento = new NLancamento($this->pegarConexao());
		$nLancamento->filtrarIdLote(operador::igual($this->valorChave()));
		$coLancamento = $nLancamento->pesquisar();
		$debito = 0;
		$credito= 0;
		while($nLancamento = $coLancamento->avancar()){
			if($nLancamento->pegarTipo() == NLancamento::Debito){
				$debito+=$nLancamento->pegarValor()->pegarNumero();
			}else{
				$credito+=$nLancamento->pegarValor()->pegarNumero();
			}
		}
		return (string)$debito == (string)$credito;
	}
	/**
	* Método utilizado para efetuar as verificações antes de executar a inclusão
	*/
	public function verificarAntesInserir(){
		$this->status = NLote::aberto;
		if(!$this->data) $this->data = TData::hoje ();
		parent::verificarAntesInserir();
	}
	/**
	* Método utilizado para efetuar as verificações antes de executar a alteração
	* @param negocio objeto antes da alteração .
	*/
	public function verificarAntesAlterar($negocio){
		parent::verificarAntesAlterar($negocio);
		if($this->data->pegarData() != $negocio->pegarData()->pegarData()){
			throw new erroNegocio('Não é possivel alterar a data de um lote');
		}
		//Se estiver fechando o lote
		if (($negocio->pegarStatus() == NLote::aberto) && ($this->status == NLote::fechado)) {
			if (!$this->validarFechamento()) {
				throw new erroNegocio('A soma de créditos deve ser igual a soma de débitos no lote.');
			}
		}
	}
	/**
	 * Fecha o lote
	 */
	public function fechar(){
		if($this->valorChave()){
			$this->status = NLote::fechado;
			$this->gravar();
		}
	}
	public function status(){
		return $this->inter->pegarOpcao('status', $this->pegarStatus());
	}
	public function  verificarAntesExcluir() {
		parent::verificarAntesExcluir();
		if($this->status == NLote::fechado) throw new erroNegocio ('Para excluir um lote ele deve estar aberto.');
		$nLancamento = new NLancamento($this->pegarConexao());
		$nLancamento->filtrarIdLote(operador::igual($this->valorChave()));
		$nLancamento->pesquisar()->excluir();
	}
}
?>